﻿using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;
namespace Odyssey.Http
{
    public interface IHttpRequester
    {
        #region GET Method
        Task<string> GetAsync(string uri, string clientName = "", IDictionary<string, string> requestHeaders = null);

        Task<string> GetAsync(Uri uri, string clientName = "", IDictionary<string, string> requestHeaders = null);

        Task<T> GetAsync<T>(string uri, string clientName = "", IDictionary<string, string> requestHeaders = null, IHttpSerializer httpSerializer = null);

        Task<T> GetAsync<T>(Uri uri, string clientName = "", IDictionary<string, string> requestHeaders = null, IHttpSerializer httpSerializer = null);
        #endregion

        #region POST Method
        Task<string> PostStringAsync(string uri, string data, string clientName = "", string contentType = "", IDictionary<string, string> requestHeaders = null, Func<HttpResponseMessage, Task> responseMessagefilter = null);

        Task<string> PostStringAsync(Uri uri, string data, string clientName = "", string contentType = "", IDictionary<string, string> requestHeaders = null, Func<HttpResponseMessage, Task> responseMessagefilter = null);

        Task<T> PostAsync<T>(string uri, string data, string clientName = "", string contentType = "", IDictionary<string, string> requestHeaders = null, IHttpSerializer httpSerializer = null, Func<HttpResponseMessage, Task> responseMessagefilter = null);

        Task<T> PostAsync<T>(Uri uri, string data, string clientName = "", string contentType = "", IDictionary<string, string> requestHeaders = null, IHttpSerializer httpSerializer = null, Func<HttpResponseMessage, Task> responseMessagefilter = null);

        Task<TResponse> PostAsync<TRequest, TResponse>(string uri, TRequest data, string clientName = "", string contentType = "", IDictionary<string, string> requestHeaders = null, IHttpSerializer httpSerializer = null, Func<HttpResponseMessage, Task> responseMessagefilter = null);

        Task<TResponse> PostAsync<TRequest, TResponse>(Uri uri, TRequest data, string clientName = "", string contentType = "", IDictionary<string, string> requestHeaders = null, IHttpSerializer httpSerializer = null, Func<HttpResponseMessage, Task> responseMessagefilter = null);

        Task<HttpResponseMessage> PostAsync(string uri, object data, string clientName = "", string contentType = "", IDictionary<string, string> requestHeaders = null, IHttpSerializer httpSerializer = null, Func<HttpResponseMessage, Task> responseMessagefilter = null);

        Task<HttpResponseMessage> PostAsync(Uri uri, object data, string clientName = "", string contentType = "", IDictionary<string, string> requestHeaders = null, IHttpSerializer httpSerializer = null, Func<HttpResponseMessage, Task> responseMessagefilter = null);

        Task<HttpResponseMessage> PostAsync(string uri, string data, string clientName = "", string contentType = "", IDictionary<string, string> requestHeaders = null, Func<HttpResponseMessage, Task> responseMessagefilter = null);

        Task<HttpResponseMessage> PostAsync(Uri uri, string data, string clientName = "", string contentType = "", IDictionary<string, string> requestHeaders = null, Func<HttpResponseMessage, Task> responseMessagefilter = null);
        #endregion

        #region PUT Method

        Task<string> PutStringAsync(string uri, string data, string clientName = "", IDictionary<string, string> requestHeaders = null);

        Task<string> PutStringAsync(Uri uri, string data, string clientName = "", IDictionary<string, string> requestHeaders = null);

        Task<HttpResponseMessage> PutAsync(string uri, string data, string clientName = "", IDictionary<string, string> requestHeaders = null);

        Task<HttpResponseMessage> PutAsync(Uri uri, string data, string clientName = "", IDictionary<string, string> requestHeaders = null);

        Task<T> PutAsync<T>(string uri, object data, string clientName = "", IDictionary<string, string> requestHeaders = null, IHttpSerializer httpSerializer = null);

        Task<T> PutAsync<T>(Uri uri, object data, string clientName = "", IDictionary<string, string> requestHeaders = null, IHttpSerializer httpSerializer = null);

        Task<TResponse> PutAsync<TRequest, TResponse>(string uri, TRequest data, string clientName = "", IDictionary<string, string> requestHeaders = null, IHttpSerializer httpSerializer = null);

        Task<TResponse> PutAsync<TRequest, TResponse>(Uri uri, TRequest data, string clientName = "", IDictionary<string, string> requestHeaders = null, IHttpSerializer httpSerializer = null);

        #endregion

        #region DELETE Method

        Task<string> DeleteStringAsync(string uri, string data, string clientName = "", IDictionary<string, string> requestHeaders = null);

        Task<string> DeleteStringAsync(Uri uri, string data, string clientName = "", IDictionary<string, string> requestHeaders = null);

        Task<HttpResponseMessage> DeleteAsync(string uri, string data, string clientName = "", IDictionary<string, string> requestHeaders = null);

        Task<HttpResponseMessage> DeleteAsync(Uri uri, string data, string clientName = "", IDictionary<string, string> requestHeaders = null);

        Task<T> DeleteAsync<T>(string uri, object data, string clientName = "", IDictionary<string, string> requestHeaders = null, IHttpSerializer httpSerializer = null);

        Task<T> DeleteAsync<T>(Uri uri, object data, string clientName = "", IDictionary<string, string> requestHeaders = null, IHttpSerializer httpSerializer = null);

        Task<TResponse> DeleteAsync<TRequest, TResponse>(string uri, TRequest data, string clientName = "", IDictionary<string, string> requestHeaders = null, IHttpSerializer httpSerializer = null);

        Task<TResponse> DeleteAsync<TRequest, TResponse>(Uri uri, TRequest data, string clientName = "", IDictionary<string, string> requestHeaders = null, IHttpSerializer httpSerializer = null);

        #endregion

        #region SEND Method

        Task<HttpResponseMessage> SendAsync(Uri uri, object data, HttpMethod httpMethod, string clientName = "", string contentType = "", IDictionary<string, string> requestHeaders = null, IHttpSerializer httpSerializer = null, Func<HttpResponseMessage, Task> responseMessagefilter = null);

        Task<HttpResponseMessage> SendAsync(Uri uri, string data, HttpMethod httpMethod, string clientName = "", string contentType = "", IDictionary<string, string> requestHeaders = null, Func<HttpResponseMessage, Task> responseMessagefilter = null);

        Task<HttpResponseMessage> SendAsync(Uri uri, byte[] data, HttpMethod httpMethod, string clientName = "", string contentType = "", IDictionary<string, string> requestHeaders = null, Func<HttpResponseMessage, Task> responseMessagefilter = null);
        #endregion
    }
}
